// chapter13.h
#ifndef _CHAPTER13_h_
#define _CHAPTER13_h_

class Investment {...}; // 继承体系中的基类

Investment* CreateInvestment(); // 工厂模式，返回指针，指向Investment体系内的动态分配对象。调用者有责任删除它。

// bad case
/*
void f(){
    Investment* pInv = CreateInvestment; // 调用工厂函数
    ... // ！！！如果这个地方提前退出当前函数，则不会执行释放对象语句，很容易造成内存泄露
    delete pInv; // 释放对象
}
*/

// 以对象管理资源
/*
void f(){
    std::auto_ptr<Investment> pInv(CreateInvestment()); // 调用工厂函数，一如即往使用 pInv，经由 auto_ptr 的析构函数自动删除 pInv
    ...
}
// 但是使用 auto_ptr 有个问题，使用 copy 构造函数 或者 copy assignment 的时候，会移交所属权
std::auto_ptr<Investment> pInv1(CreateInvestment()); // pInv1 指向 CreateInvestment 返回物
std::auto_ptr<Investment> pInv2(pInv1);              // 现在pInv2指向对象，pInv1 被设置为 null
std::auto_ptr<Investment> pInv1 = pInv2;             // 现在pInv1指向对象，pInv2 被设置为 null
*/

// best practice
// 使用 引用计数型智慧指针 （reference-counting smart pointer; RCSP）
void f(){
    ...
    std::tr1::shared_ptr<Investment> pInv1(CreateInvestment()); // pInv1 指向 CreateInvestment 返回物

    std::tr1::shared_ptr<Investment> pInv2(pInv1);              // pInv1 和 pInv2 指向同一个对象
    pInv1 = pInv2;                                              // 同上，无任何变化
    ...
}                                                               // pInv1 和 pInv2 被销毁，它们所指的对象也就被自动销毁



#endif